package com.hon.legionnaire.negocio.vo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "produto")
@SequenceGenerator(name = "produto_seq", sequenceName = "produto_cod_produto_seq", allocationSize = 1)
@NamedQueries ({
	@NamedQuery(name = "loadAllProduto", query = "from ProdutoVO"),
	@NamedQuery(name = "findProduto", query = "from ProdutoVO as c where c.codigo = :codigo"),
	@NamedQuery(name = "findDuplicatedProduto", query = "from ProdutoVO as c where c.descricao = :descricao and c.marcaVO.codigo = :cod_marca and c.unidadeVO.codigo = :cod_unidade and c.codigo != :codigo")
})
public class ProdutoVO implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "cod_produto")
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "produto_seq")
	private int codigo;
	
	@Column(name = "descricao", length = 30, unique = true)
	private String descricao;
	
	@Column(name = "quantidade_minima")
	private Integer quantidadeMinima;
	
	@Column(name = "icms")
	private Integer icms;
	
	@Column(name = "custo")
	private Float custo;
	
	@Column(name = "situacao_tributaria")
	private Integer situacaoTributaria;
	
	@Column(name = "qtde_estoque")
	private Integer quantidadeEstoque;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "cod_marca")
	@Fetch(FetchMode.JOIN)
	private MarcaVO marcaVO;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "cod_unidade")
	@Fetch(FetchMode.JOIN)
	private UnidadeVO unidadeVO;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column (name = "data_criacao")
	private Date dataCriacao;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column (name = "data_alteracao")
	private Date dataAlteracao;
	
	@Column (name = "preco_venda")
	private Float precoVenda;
	
	/*@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "produtoVO")
	@JoinColumn(name = "cod_produto", nullable = false)*/
	//@OneToMany(mappedBy = "produtoVO")
//	private List<ProdutoCompraVO> listaProdutoCompraVO;
	
/*	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "produtoVO")
	@JoinColumn(name = "cod_produto", nullable = false)
	private List<ProdutoVendaVO> listaProdutoVendaVO;*/
	
	@Column(name = "comentario", length = 200)
	private String comentario;
	
	public ProdutoVO(){
//		this.setListaProdutoCompraVO(null);
	}

	public ProdutoVO(int codigo, String descricao, float preco,
			int quantidadeEstoque, int quantidadeMinima, MarcaVO marcaVO,
			UnidadeVO unidadeVO, Date dataCriacao, Date dataAlteracao,
			String comentario) {
		super();
		this.codigo = codigo;
		this.descricao = descricao;
		this.quantidadeMinima = quantidadeMinima;
		this.marcaVO = marcaVO;
		this.unidadeVO = unidadeVO;
		this.dataCriacao = dataCriacao;
		this.dataAlteracao = dataAlteracao;
		this.comentario = comentario;
		//this.quantidadeEstoque = 0;
	}

	public Integer getIcms() {
		return icms;
	}

	public void setIcms(Integer icms) {
		this.icms = icms;
	}

	public Integer getSituacaoTributaria() {
		return situacaoTributaria;
	}

	public void setSituacaoTributaria(Integer situacaoTributaria) {
		this.situacaoTributaria = situacaoTributaria;
	}

	public Integer getQuantidadeMinima() {
		return quantidadeMinima;
	}


	public void setQuantidadeMinima(Integer quantidadeMinima) {
		this.quantidadeMinima = quantidadeMinima;
	}


	public MarcaVO getMarcaVO() {
		return marcaVO;
	}


	public void setMarcaVO(MarcaVO marcaVO) {
		this.marcaVO = marcaVO;
	}


	public UnidadeVO getUnidadeVO() {
		return unidadeVO;
	}


	public void setUnidadeVO(UnidadeVO unidadeVO) {
		this.unidadeVO = unidadeVO;
	}


	public String getComentario() {
		return comentario;
	}


	public void setComentario(String comentario) {
		this.comentario = comentario;
	}


	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	
	public String getDescricao() {
		return descricao;
	}
	
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public void setDataCriacao(Date dataCriacao) {
		this.dataCriacao = dataCriacao;
	}

	public Date getDataCriacao() {
		return dataCriacao;
	}

	public void setDataAlteracao(Date dataAlteracao) {
		this.dataAlteracao = dataAlteracao;
	}

	public Float getCusto() {
		return custo;
	}

	public void setCusto(Float custo) {
		this.custo = custo;
	}

	public Date getDataAlteracao() {
		return dataAlteracao;
	}

	public Integer getQuantidadeEstoque() {
		return quantidadeEstoque;
	}

	public void setQuantidadeEstoque(Integer quantidadeEstoque) {
		this.quantidadeEstoque = quantidadeEstoque;
	}

	public Float getPrecoVenda() {
		return precoVenda;
	}

	public void setPrecoVenda(Float precoVenda) {
		this.precoVenda = precoVenda;
	}

/*	public List<ProdutoCompraVO> getListaProdutoCompraVO() {
		return listaProdutoCompraVO;
	}

	public void setListaProdutoCompraVO(List<ProdutoCompraVO> listaProdutoCompraVO) {
		this.listaProdutoCompraVO = listaProdutoCompraVO;
	}*/
/*
	public List<ProdutoVendaVO> getListaProdutoVendaVO() {
		return listaProdutoVendaVO;
	}

	public void setListaProdutoVendaVO(List<ProdutoVendaVO> listaProdutoVendaVO) {
		this.listaProdutoVendaVO = listaProdutoVendaVO;
	}*/
	
}